package org.dromara.workflow.flowable.handler;

import org.dromara.workflow.common.enums.TaskStatusEnum;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.TaskService;
import org.flowable.engine.impl.jobexecutor.TimerEventHandler;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.job.service.JobHandler;
import org.flowable.job.service.impl.persistence.entity.JobEntity;
import org.flowable.task.api.Task;
import org.flowable.variable.api.delegate.VariableScope;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：办理超时(过期)任务
 */
/**
 * 任务超时处理程序类
 * 该类继承自TimerEventHandler，实现了JobHandler接口，用于处理任务的超时逻辑
 * 主要职责是定时检查任务是否超时，并执行相应的超时处理逻辑
 */
public class TaskTimeoutJobHandler extends TimerEventHandler implements JobHandler {

    /**
     * 定义任务超时事件的类型标识
     * 该常量用于表示特定类型的事件或消息，确保在系统中具有一致的标识
     */
    public static final String TYPE = "taskTimeout";

    /**
     * 获取任务超时事件的类型标识
     * 此方法覆盖了基类的方法，用于返回特定的任务超时事件类型
     *
     * @return 表示任务超时事件类型的字符串
     */
    @Override
    public String getType() {
        return TYPE;
    }

    /**
     * 执行任务自动审批操作
     *
     * @param job 定时任务实体，代表当前执行的定时任务
     * @param configuration 流程定义的key，用于查询和完成任务
     * @param variableScope 变量作用域，可以在流程中传递变量
     * @param commandContext 指令上下文，用于访问底层服务
     */
    @Override
    public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
        // 获取任务服务
        TaskService taskService = CommandContextUtil.getProcessEngineConfiguration(commandContext)
            .getTaskService();

        // 根据配置项查询任务
        Task task = taskService.createTaskQuery().taskId(configuration).singleResult();

        // 如果任务存在，则添加超时审批评论并完成任务
        if (task != null) {
            taskService.addComment(task.getId(), task.getProcessInstanceId(), TaskStatusEnum.TIMEOUT.getStatus(), "超时自动审批!");
            taskService.complete(configuration);
        }
    }
}
